{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# DNA_construct Examples\n", "\n", "DNA_construct is a flexible way to indicate a DNA sequence.\n", "\n", "A DNA sequence is composed of a string of nucleotides. The sequence of these nucleotides can allow binding of other biomolecules such as proteins or RNA. We choose to annotate known binding interactions and other features of DNA sequences by considering them to be \"DNA parts\". a \"part\" has a certain function, and the order and orientation of parts on a dna sequence describes the overall function of that DNA sequence.\n", "\n", "For example, a `Promoter` is a part which binds to RNA polymerase and causes everything downstream to be transcribed into RNA. A `Terminator`, then, is a sequence which stops the transcription of DNA into RNA. Therefore, anything between a `Promoter` and a `Terminator` gets turned into RNA.\n", "\n", "Other parts such as a Ribosome Binding Site or `RBS`, binds to the ribosome, but only if it is made of RNA and not DNA. Thus, an `RBS` is _like_ a `Promoter`, but instead of RNA it makes Protein. As always the position and orientation of parts determines what those parts actually do. If your sequence contains a Coding Sequence (`CDS`) _before_ an `RBS`, then the ribosome actually cannot translate that protein. Likewise if your `RBS` is after a `Terminator`, that `RBS` never gets turned into RNA.\n", "\n", "This type of logic is incorporated into `DNA_construct`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The basic workflow is to first define a list of parts, then string them together into a `DNA_construct`" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "imports done!\n", "enumerating components\n", "\n", "[ptet_0, RNA_construct = UTR1_GFP_t16]\n", "\n", "CRN species\n", "dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "protein[RNAP]\n", "protein[Ribo]\n", "protein[RNAase]\n", "rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[part[ptet]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "protein[tetr]\n", "ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[complex[part[ptet]:2x_protein[tetr]]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "protein[Ribosome]\n", "ordered_polymer[complex[part[UTR1]:protein[Ribosome]-forward]:part[GFP-forward]:part[t16-forward]]\n", "protein[GFP]\n", "complex[protein[RNAase]:rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]]\n", "\n", "CRN reactions\n", "dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP] <--> ordered_polymer[complex[part[ptet]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", " Kf=k_forward * dna_part_ptet_forward_part_UTR1_forward_part_GFP_forward_part_t16_forward_ * protein_RNAP\n", " Kr=k_reverse * ordered_polymer_complex_part_ptet_protein_RNAP_forward__part_UTR1_forward_part_GFP_forward_part_t16_forward_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=transcription_mm, partid=ptet_leak, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=transcription_mm, partid=ptet_leak, name=ku).\n", "\n", "ordered_polymer[complex[part[ptet]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]] --> dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP]\n", " Kf=k_forward * ordered_polymer_complex_part_ptet_protein_RNAP_forward__part_UTR1_forward_part_GFP_forward_part_t16_forward_\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=transcription_mm, partid=ptet_leak, name=ktx).\n", "\n", "2protein[tetr]+dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]] <--> ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", " Kf=k_forward * protein_tetr^2 * dna_part_ptet_forward_part_UTR1_forward_part_GFP_forward_part_t16_forward_\n", " Kr=k_reverse * ordered_polymer_complex_part_ptet_protein_tetr_2x_forward__part_UTR1_forward_part_GFP_forward_part_t16_forward_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=one_step_cooperative_binding, partid=ptet_tetr, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=one_step_cooperative_binding, partid=ptet_tetr, name=ku).\n", "\n", "ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP] <--> ordered_polymer[complex[complex[part[ptet]:2x_protein[tetr]]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", " Kf=k_forward * ordered_polymer_complex_part_ptet_protein_tetr_2x_forward__part_UTR1_forward_part_GFP_forward_part_t16_forward_ * protein_RNAP\n", " Kr=k_reverse * ordered_polymer_complex_complex_part_ptet_protein_tetr_2x__protein_RNAP_forward__part_UTR1_forward_part_GFP_forward_part_t16_forward_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=transcription_mm, partid=ptet_tetr, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=transcription_mm, partid=ptet_tetr, name=ku).\n", "\n", "ordered_polymer[complex[complex[part[ptet]:2x_protein[tetr]]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]] --> ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP]\n", " Kf=k_forward * ordered_polymer_complex_complex_part_ptet_protein_tetr_2x__protein_RNAP_forward__part_UTR1_forward_part_GFP_forward_part_t16_forward_\n", " k_forward=0.05\n", " found_key=(mech=None, partid=None, name=ktx).\n", " search_key=(mech=transcription_mm, partid=ptet_tetr, name=ktx).\n", "\n", "rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[Ribosome] <--> ordered_polymer[complex[part[UTR1]:protein[Ribosome]-forward]:part[GFP-forward]:part[t16-forward]]\n", " Kf=k_forward * rna_part_UTR1_forward_part_GFP_forward_part_t16_forward_ * protein_Ribosome\n", " Kr=k_reverse * ordered_polymer_complex_part_UTR1_protein_Ribosome_forward__part_GFP_forward_part_t16_forward_\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=translation_mm, partid=UTR1, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=translation_mm, partid=UTR1, name=ku).\n", "\n", "ordered_polymer[complex[part[UTR1]:protein[Ribosome]-forward]:part[GFP-forward]:part[t16-forward]] --> rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[GFP]+protein[Ribosome]\n", " Kf=k_forward * ordered_polymer_complex_part_UTR1_protein_Ribosome_forward__part_GFP_forward_part_t16_forward_\n", " k_forward=0.2\n", " found_key=(mech=None, partid=None, name=ktl).\n", " search_key=(mech=translation_mm, partid=UTR1, name=ktl).\n", "\n", "rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAase] <--> complex[protein[RNAase]:rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]]\n", " Kf=k_forward * rna_part_UTR1_forward_part_GFP_forward_part_t16_forward_ * protein_RNAase\n", " Kr=k_reverse * complex_protein_RNAase_rna_part_UTR1_forward_part_GFP_forward_part_t16_forward__\n", " k_forward=100\n", " found_key=(mech=None, partid=None, name=kb).\n", " search_key=(mech=rna_degradation_mm, partid=rna_part_UTR1_forward_part_GFP_forward_part_t16_forward_, name=kb).\n", " k_reverse=10\n", " found_key=(mech=None, partid=None, name=ku).\n", " search_key=(mech=rna_degradation_mm, partid=rna_part_UTR1_forward_part_GFP_forward_part_t16_forward_, name=ku).\n", "\n", "complex[protein[RNAase]:rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]] --> protein[RNAase]\n", " Kf=k_forward * complex_protein_RNAase_rna_part_UTR1_forward_part_GFP_forward_part_t16_forward__\n", " k_forward=2\n", " found_key=(mech=None, partid=None, name=kdeg).\n", " search_key=(mech=rna_degradation_mm, partid=rna_part_UTR1_forward_part_GFP_forward_part_t16_forward_, name=kdeg).\n", "\n" ] } ], "source": [ "from biocrnpyler.core import Species\n", "from biocrnpyler.components import RegulatedPromoter, Promoter, RBS, CDS, Terminator, DNA_construct\n", "from biocrnpyler.mechanisms import Transcription_MM, Translation_MM, One_Step_Cooperative_Binding\n", "from biocrnpyler.mixtures import TxTlExtract\n", "from biocrnpyler.utils.plotting import render_network_bokeh \n", "try:\n", " #dnaplotlib is a cool library for plotting DNAs.\n", " #please use my fork located at https://github.com/dr3y/dnaplotlib\n", " #to install it type: pip install git+git://github.com/dr3y/dnaplotlib.git@master\n", " import dnaplotlib as dpl # type: ignore\n", " %matplotlib inline\n", " dpl_enabled = True\n", "except (ModuleNotFoundError,ImportError) as e:\n", " dpl_enabled = False\n", "print(\"imports done!\")\n", "\n", "def plotNetwork(inCRN,use_pretty_print=True,colordict = None,iterations=2000,rseed=30,posscale=1,export=False,colordict_append=None):\n", " try:\n", " from bokeh.models import (Plot , Range1d) # type: ignore\n", "\n", " import bokeh.plotting # type: ignore\n", " import bokeh.io # type: ignore\n", " bokeh.io.output_notebook() #this makes the graph appear in line with the notebook\n", " if(colordict is None):\n", " colordict={\"complex\":\"cyan\",\"protein\":\"green\",\n", " \"GFP\":\"lightgreen\",\n", " \"RFP\":\"red\",\n", " \"ribosome\":\"blue\",\n", " \"dna\":\"white\",\"rna\":\"orange\",\n", " \"ligand\":\"pink\",\"phosphate\":\"yellow\",\"nothing\":\"purple\"}\n", " if(colordict_append is not None):\n", " colordict.update(colordict_append)\n", " #now you draw the network on the plot. Layout \"force\" is \n", " plot = render_network_bokeh(inCRN,use_pretty_print=use_pretty_print,colordict=colordict,layout=\"force\",iterations=iterations,rseed=rseed,posscale=posscale)\n", " bokeh.io.show(plot) #if you don't type this the plot won't show\n", " if(export):\n", " plot.output_backend = \"svg\"\n", " bokeh.io.export_svgs(plot, \"plot_file.svg\")\n", " \n", " except ModuleNotFoundError:\n", " return None\n", "\n", "\n", "\n", "\n", "ptet = RegulatedPromoter(\"ptet\",[\"tetr\"],leak=True) #this is a repressible promoter\n", "pconst = Promoter(\"pconst\") #constitutive promoter\n", "utr1 = RBS(\"UTR1\") #regular RBS\n", "gfp = CDS(\"GFP\",\"GFP\")\n", "rfp = CDS(\"RFP\",\"RFP\")\n", "t16 = Terminator(\"t16\") #a terminator stops transcription\n", "\n", "\n", "#now that the parts are defined, we can put together our construct.\n", "parameters={\"cooperativity\":2,\"kb\":100, \"ku\":10, \"ktx\":.05, \"ktl\":.2, \"kdeg\":2,\"kint\":.05}\n", "\n", "construct_1 = DNA_construct([[ptet,\"forward\"],[utr1,\"forward\"],[gfp,\"forward\"],[t16,\"forward\"]],\\\n", " mechanisms = {\"transcription\":Transcription_MM(Species(\"RNAP\",material_type=\"protein\")),\\\n", " \"translation\":Translation_MM(Species(\"Ribosome\",material_type=\"protein\")),\\\n", " \"binding\":One_Step_Cooperative_Binding()},parameters=parameters) \n", "''\n", "#some very basic parameters are defined\n", "parameters={\"cooperativity\":2,\"kb\":100, \"ku\":10, \"ktx\":.05, \"ktl\":.2, \"kdeg\":2,\"kint\":.05}\n", "\n", "components = [construct_1]\n", "myMixture = TxTlExtract(name = \"txtl\", parameters = parameters, components = components)\n", "myCRN = myMixture.compile_crn()\n", "print(\"enumerating components\")\n", "comps = myMixture.get_component(construct_1).enumerate_components()\n", "\n", "w = construct_1.enumerate_components()\n", "print()\n", "print(w)\n", "\n", "x = myCRN.species\n", "print()\n", "print(\"CRN species\")\n", "print('\\n'.join([a.pretty_print() for a in x]))\n", "\n", "y = myCRN.reactions\n", "print()\n", "print(\"CRN reactions\")\n", "print('\\n'.join([a.pretty_print() for a in y]))\n", "#'''\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "imports done!\n", "enumerating components\n", "\n", "CRN species\n", "dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "dna[part[t16-reverse]:part[RFP-reverse]:part[UTR1-reverse]:part[pconst-reverse]]\n", "protein[RNAP]\n", "protein[Ribo]\n", "protein[RNAase]\n", "rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[part[ptet]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "protein[tetr]\n", "ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[complex[part[ptet]:2x_protein[tetr]]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]\n", "ordered_polymer[part[t16-reverse]:part[RFP-reverse]:part[UTR1-reverse]:complex[part[pconst]:protein[RNAP]-reverse]]\n", "ordered_polymer[complex[part[UTR1]:protein[Ribo]-forward]:part[GFP-forward]:part[t16-forward]]\n", "protein[GFP]\n", "ordered_polymer[complex[part[UTR1]:protein[Ribo]-forward]:part[RFP-forward]:part[t16-forward]]\n", "protein[RFP]\n", "complex[protein[RNAase]:rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]]\n", "complex[protein[RNAase]:rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]]\n", "\n", "CRN reactions\n", "dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP] <--> ordered_polymer[complex[part[ptet]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[part[ptet]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]] --> dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP]\n", "2protein[tetr]+dna[part[ptet-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]] <--> ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP] <--> ordered_polymer[complex[complex[part[ptet]:2x_protein[tetr]]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[complex[part[ptet]:2x_protein[tetr]]:protein[RNAP]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]] --> ordered_polymer[complex[part[ptet]:2x_protein[tetr]-forward]:part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAP]\n", "dna[part[t16-reverse]:part[RFP-reverse]:part[UTR1-reverse]:part[pconst-reverse]]+protein[RNAP] <--> ordered_polymer[part[t16-reverse]:part[RFP-reverse]:part[UTR1-reverse]:complex[part[pconst]:protein[RNAP]-reverse]]\n", "ordered_polymer[part[t16-reverse]:part[RFP-reverse]:part[UTR1-reverse]:complex[part[pconst]:protein[RNAP]-reverse]] --> dna[part[t16-reverse]:part[RFP-reverse]:part[UTR1-reverse]:part[pconst-reverse]]+rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]+protein[RNAP]\n", "rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[Ribo] <--> ordered_polymer[complex[part[UTR1]:protein[Ribo]-forward]:part[GFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[part[UTR1]:protein[Ribo]-forward]:part[GFP-forward]:part[t16-forward]] --> rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[GFP]+protein[Ribo]\n", "rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]+protein[Ribo] <--> ordered_polymer[complex[part[UTR1]:protein[Ribo]-forward]:part[RFP-forward]:part[t16-forward]]\n", "ordered_polymer[complex[part[UTR1]:protein[Ribo]-forward]:part[RFP-forward]:part[t16-forward]] --> rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]+protein[RFP]+protein[Ribo]\n", "rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]+protein[RNAase] <--> complex[protein[RNAase]:rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]]\n", "complex[protein[RNAase]:rna[part[UTR1-forward]:part[GFP-forward]:part[t16-forward]]] --> protein[RNAase]\n", "rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]+protein[RNAase] <--> complex[protein[RNAase]:rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]]\n", "complex[protein[RNAase]:rna[part[UTR1-forward]:part[RFP-forward]:part[t16-forward]]] --> protein[RNAase]\n" ] } ], "source": [ "from biocrnpyler.components import CombinatorialPromoter\n", "from biocrnpyler.utils.plotting import render_constructs\n", "try:\n", " #dnaplotlib is a cool library for plotting DNAs.\n", " #please use my fork located at https://github.com/dr3y/dnaplotlib\n", " #to install it type: pip install git+git://github.com/dr3y/dnaplotlib.git@master\n", " import dnaplotlib as dpl # type: ignore\n", " dpl_enabled = True\n", "except (ModuleNotFoundError,ImportError) as e:\n", " dpl_enabled = False\n", "\n", "print(\"imports done!\")\n", "\n", "#part definitions below\n", "\n", "ptet = RegulatedPromoter(\"ptet\",[\"tetr\"],leak=True) #this is a repressible promoter\n", "pconst = Promoter(\"pconst\") #constitutive promoter\n", "pcomb = CombinatorialPromoter(\"pcomb\",[\"arac\",\"laci\"], leak=False,\n", " tx_capable_list = [[\"arac\"], [\"laci\"]]) #the Combinations A and B or just A or just B be transcribed\n", "utr1 = RBS(\"UTR1\") #regular RBS\n", "utr2 = RBS(\"UTR1\") #regular RBS\n", "gfp = CDS(\"GFP\") #a CDS has a name and a protein name. so this one is called GFP and the protein is also called GFP\n", "fusrfp = CDS(\"fusRFP\",\"RFP\",no_stop_codons=[\"forward\"]) #you can say that a protein has no stop codon. This is a little different from a fusion protein, because in this case you are saying that the ribosome reads through two proteins but still produces two distinct proteins, rather than one fused protein. This can happen in the case of the ta peptide which causes a peptide bond not to be formed while making a protein.\n", "rfp = CDS(\"RFP\") #regular RFP\n", "cfp = CDS(\"CFP\") #cfp\n", "t16 = Terminator(\"t16\") #a terminator stops transcription\n", "\n", "\n", "#now that the parts are defined, we can put together our construct.\n", "construct_1 = DNA_construct([[ptet,\"forward\"],[utr1,\"forward\"],[gfp,\"forward\"],[t16,\"forward\"]])\n", "construct_2 = DNA_construct([[t16,\"reverse\"],[rfp,\"reverse\"],[utr1,\"reverse\"],[pconst,\"reverse\"]])\n", "\n", "#now, we are using dnaplotlib to plot the constructs\n", "\n", "\n", "if(dpl_enabled):\n", " cdict = {\"GFP\":\"green\",\"RFP\":\"red\",\"pconst\":\"black\",\"Terminator\":\"black\"}\n", " render_constructs([construct_1,construct_2],color_dictionary=cdict)\n", "#some very basic parameters are defined\n", "parameters={\"cooperativity\":2,\"kb\":100, \"ku\":10, \"ktx\":.05, \"ktl\":.2, \"kdeg\":2,\"kint\":.05}\n", "\n", "components = [construct_1,construct_2]\n", "myMixture = TxTlExtract(name = \"txtl\", parameters = parameters, components = components)\n", "\n", "print(\"enumerating components\")\n", "#comps = myMixture.get_component(construct_1).enumerate_components()\n", "\n", "myCRN = myMixture.compile_crn()\n", "\n", "x = myCRN.species\n", "print()\n", "print(\"CRN species\")\n", "print('\\n'.join([a.pretty_print() for a in x]))\n", "\n", "y = myCRN.reactions\n", "print()\n", "print(\"CRN reactions\")\n", "print('\\n'.join([str(a) for a in y]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see that for the first construct, your DNA is given an automatic name: `ptet_f_UTR1_f_GFP_f_t16_f`. \n", "\n", "The RNA made from your DNA is also given an automatic name: `UTR1_f_GFP_f_t16_f`\n", "\n", "Likewise for the second construct, which I've made in reverse to make the difference more apparent. Though you'll see that the RNA from the second construct is still produced in the right orientation, so the RNA is shown in the forwards direction.\n", "\n", "This is because DNA and RNA are now represented as an OrderedPolymer. Each member of the OrderedPolymer represents a part. So, in the case of promoters or RBSes, you'll see ribosomes and polymerases bind directly to the part inside the OrderedPolymer." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ " \n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "'use strict';\n", "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " function drop(id) {\n", " const view = Bokeh.index.get_by_id(id)\n", " if (view != null) {\n", " view.model.document.clear()\n", " Bokeh.index.delete(view)\n", " }\n", " }\n", "\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", "\n", " // Clean up Bokeh references\n", " if (id != null) {\n", " drop(id)\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim()\n", " drop(id)\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"\\n\"+\n",
" \"\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"\\n\"+\n",
" \"\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"\\n\"+\n",
" \"\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"